home *** CD-ROM | disk | FTP | other *** search
- #include <math.h>
-
- #include "view.h"
-
- #define min(x,y) (((x) < (y)) ? (x) : (y))
- #define abs(x) (((x) > 0) ? (x) : -(x))
-
- extern char *screenbuf;
- extern short width;
- extern short height;
- extern short scale;
-
- extern short wallcol;
-
- void draw_line(short from, short to, short colour)
- {
- long x1a, y1a, x2a, y2a;
- double x1, y1, x2, y2, tmp;
- double k, xd, yd;
- vertex *Vertex;
- char *pos;
- long y, x;
- static long sPangle = -1;
- static double s, c;
- long x1l, y1l, x2l, y2l, xl, yl, kl, tmpl;
-
- if (!wallcol)
- colour = 0xff;
-
- Vertex = &Vertex_Array[from];
- x1a = Px - Vertex->x;
- y1a = Vertex->y - Py;
- Vertex = &Vertex_Array[to];
- x2a = Px - Vertex->x;
- y2a = Vertex->y - Py;
-
- #if 1
- x1l = ((x1a * SinPangle) - (y1a * CosPangle)); /* Had >> 16 */
- x2l = ((x2a * SinPangle) - (y2a * CosPangle));
-
- y1l = ((y1a * SinPangle) + (x1a * CosPangle));
- y2l = ((y2a * SinPangle) + (x2a * CosPangle));
-
- x1l = x1l / scale + ((long)width << 15);
- y1l = y1l / scale + ((long)(height * 3) << 14); /* *0.75 */
- x2l = x2l / scale + ((long)width << 15);
- y2l = y2l / scale + ((long)(height * 3) << 14);
-
- if (abs(y1l - y2l) > abs(x1l - x2l)) {
- /* Always draw from top to bottom (y1 -> y2) */
- if (y1l > y2l) {
- tmpl = y1l;
- y1l = y2l;
- y2l = tmpl;
- tmpl = x1l;
- x1l = x2l;
- x2l = tmpl;
- }
-
- kl = (x1l - x2l) / ((y1l - y2l) >> 16);
-
- x1l = x1l >> 16;
- y1l = y1l >> 16;
- x2l = x2l >> 16;
- y2l = y2l >> 16;
- pos = screenbuf + width * y1l;
- for(y = y1l, xl = x1l << 16;y <= min(height - 1, y2l);y++, xl += kl) {
- if ((y >= 0) && (xl >= 65535L) && (xl < ((long)width << 16))) {
- *(pos + (xl >> 16)) = colour;
- }
- pos += width;
- }
- } else {
- if (x1l > x2l) {
- tmpl = y1l;
- y1l = y2l;
- y2l = tmpl;
- tmpl = x1l;
- x1l = x2l;
- x2l = tmpl;
- }
-
- kl = (y1l - y2l) / ((x1l - x2l) >> 16);
-
- x1l = x1l >> 16;
- y1l = y1l >> 16;
- x2l = x2l >> 16;
- y2l = y2l >> 16;
- pos = screenbuf + x1l;
- for(x = x1l, yl = y1l << 16;x <= min(width - 1, x2l);x++, yl += kl) {
- if ((x >= 0) && (yl >= 65535L) && (yl < ((long)height << 16))) {
- *(pos + (yl >> 16) * width) = colour;
- }
- pos += 1;
- }
- }
- #else
- if (Pangle != sPangle) {
- s = sin((double)(-Pangle) / 65536L * 2 * M_PI);
- c = cos((double)(-Pangle) / 65536L * 2 * M_PI);
- sPangle = Pangle;
- }
-
- x1 = x1a * s - y1a * c;
- x2 = x2a * s - y2a * c;
- y1 = y1a * s + x1a * c;
- y2 = y2a * s + x2a * c;
-
- x1 = x1 / scale + width * 0.5;
- y1 = y1 / scale + height * 0.5;
- x2 = x2 / scale + width * 0.5;
- y2 = y2 / scale + height * 0.5;
-
- if (abs(y1 - y2) > abs(x1 - x2)) {
- /* Always draw from top to bottom (y1 -> y2) */
- if (y1 > y2) {
- tmp = y1;
- y1 = y2;
- y2 = tmp;
- tmp = x1;
- x1 = x2;
- x2 = tmp;
- }
-
- k = ((double)x1 - x2) / (y1 - y2);
-
- pos = screenbuf + width * (long)y1;
- for(y = y1, xd = x1;y <= min((double)height - 1, y2);y++, xd += k) {
- if ((y >= 0) && (xd >= 0) && (xd < width)) {
- *(pos + (long)xd) = colour;
- }
- pos += width;
- }
- } else {
- if (x1 > x2) {
- tmp = y1;
- y1 = y2;
- y2 = tmp;
- tmp = x1;
- x1 = x2;
- x2 = tmp;
- }
-
- k = ((double)y1 - y2) / (x1 - x2);
-
- pos = screenbuf + (long)x1;
- for(x = x1, yd = y1;x <= min((double)width - 1, x2);x++, yd += k) {
- if ((x >= 0) && (yd >= 0) && (yd < height)) {
- *(pos + (long)yd * width) = colour;
- }
- pos += 1;
- }
- }
- #endif
-
- }
-